from django.shortcuts import render, HttpResponse
from app.models import Case2
import jieba
#基于TF-IDF 文本相似性实战
# coding=utf-8
import jieba.analyse,os
from sklearn.feature_extraction.text import CountVectorizer
import numpy as np
import pandas as pd
from scipy.linalg import norm
from tqdm import tqdm


#句子预处理
def pretreatment(text):#数据预处理
    # 1、分词处理
    text = jieba.cut(text.strip())
    # 2、去除停用词
    # 创建一个停用词列表
    stopwords = [line.strip() for line in
                 open('D:\pythonCode\TF_IDF_Medical\\app\data\stopwords.txt', encoding='UTF-8').readlines()]
    sentence = ''
    # 去停用词
    for word in text:
        if word not in stopwords:
            if word != '\t':
                sentence += word
                sentence += " "
    return sentence

#TF词频统计算法
def tf_similarity(s1, s2):
    cv = CountVectorizer(tokenizer=lambda s: s.split())
    corpus = [s1, s2]
    vectors = cv.fit_transform(corpus).toarray()
    # print(vectors)
    # 计算TF系数
    return np.dot(vectors[0], vectors[1]) / (norm(vectors[0]) * norm(vectors[1]))


#搜索功能（获取匹配列表）
def do_search_(request):
    if request.method=="POST":
        #1、获取搜索页面提交的描述字符
        description=request.POST.get("description")
        #2、文本预处理
        sentence = pretreatment(description)#-------对前端页面获取的症状描述进行数据处理
        #3、获取数据库中的全部信息
        data_list = Case2.objects.all()
        #4、创建数据字典和数据列表（盛装字典数据）
        data_dict={}
        Data=[]
        #5、计算相似度
        for data in data_list:
            name = data.case_name
            introduction = data.case_introduction
            symbols = data.case_detail_symptoms#获取数据库中的病症描述
            symbols = pretreatment(symbols)#--------对数据库中的病症描述进行数据处理
            value = tf_similarity(sentence, symbols)#使用tf算法计算用户描述和数据库中的病症描述的词频相似度
            if(value>=0.1):#设置相似度阈值为0.5
                data_dict["value"] = value
                data_dict["name"]=name
                data_dict["introduction"]=introduction
                #print(data_dict[value],data_dict[name],data_dict[introduction])
                Data.append(data_dict)# 将键值对以元组的形式存放（方便后续使用sort函数进行排序），最后保存在一个列表中
                data_dict={}#data_list是河水，data_dict是瓢，Data是桶，每次用字典data_dict从data_list中取出一瓢倒入桶中，水瓢都是清空后的状态再继续舀水的。
        for d in Data:
            print(d)
        print("-----------------------------------------------------------------------")
        #6、根据列表元素元组中的【value】键值进行排序//参考：https://blog.csdn.net/qq_43030934/article/details/130362853
        Data.sort(key=lambda data:data['value'],reverse=True);#根据列表第1个元素排序（默认为根据第一个元素进行排序）# reverse=True--降序排序
        for d in Data:
            print(d)
       # Dict = sorted(data_dict.items(), key=lambda x:x[1], reverse = True)
        #7、将字典中的病症名称进行过滤,先遍历字典再遍历数组，顺序不能乱，要按照字典中排列好的顺序显示
        #Data=[]
        #for key in Dict:
        #    for data in data_list:#遍历全部病例和字典中的病例名进行匹配，将名字相同的病例装入Data列表
        #        if data.case_name==key[0]:
        #            Data.append(data)
        # for d in Data:
        #   print(d)
        # 8、将数组中的值返回给列表页面
        # return render(request, 'get_list_.html', {"data_list": Data,"values":dic_values})


        return render(request, 'get_list_.html', {"datas": Data})
    return render(request,'do_search_.html')


#获取详情页面信息
def get_details_(request,uname):
    data_details = Case2.objects.all().filter(case_name=uname).first()
    return render(request,'get_details_.html',{"data_details":data_details})

